/*
* INSANE - Interactive Structural Analysis Environment
*
* Copyright (C) 2003-2005
* Universidade Federal de Minas Gerais
* Escola de Engenharia
* Departamento de Engenharia de Estruturas
* 
* Author's email :    insane@dees.ufmg.br
* Author's website :  http://www.dees.ufmg.br/insane
* 
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
package br.ufmg.dees.insane.ui.rich.learn.learn_view.model_view.command;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;


/**
*
* @author Moreira, Renata & Pitangueira, Roque
* @since May 2005
*/
public class ModelStiffnessPanel extends JPanel implements ActionListener, DocumentListener,TableModelListener {
      
	private static final long serialVersionUID = 1L;

	//componente para o titulo do trabalho 
	  JLabel titulo;
	  
	  //componentes dos resultados
	  private JTextArea quadroRes;
	  
	  //variaveis para o calculo
	  //parametros com valores iniciais pre-definidos
	  private int ordem; 
	  
	  // parametros dos tabelas
	  private JTable tableA, tableB, tableX;
	  private JScrollPane scrollPaneTabelaA,scrollPaneTabelaB,scrollPaneTabelaX;
	 // private MyTableModel tabelaModeloA,tabelaModeloB,tabelaModeloX;
	  
	  // paineis com matrizes
	  private  JPanel painelMA, painelMB, painelMX, painelCentral2;
	    
	  //dimensoes da janela total
	  private int larguraTotal;
	  
	  public ModelStiffnessPanel(){}
	  /** Construtor do painel principal do Frame
	   * @param w largura da janela escolhida
	   * @param h altura da janela escolhida
	   * @param opMetodos lista de metodos a ser exibida   */
	  public ModelStiffnessPanel(int w,int h, int o, Object[][] K){
	  	ordem=o;
	  	
	    this.larguraTotal=w;
	    
	    //this.opMetodos=new String[opMetodos.length];
	    //for (int i=0;i<opMetodos.length;i++)this.opMetodos[i]=opMetodos[i];
	    
	    //matrizB=inicializaVetor(0);
	    //matrizX=f;
//		 Cria painel titulo
		JPanel paineltitulo =new JPanel();	
		Border titled = BorderFactory.createEtchedBorder();	
		paineltitulo.setBorder(titled);
		titulo=new JLabel("MODEL STIFFNESS");
		titulo.setFont(new Font("SansSerif",Font.BOLD,14));
		paineltitulo.add(titulo);
		
		// cria o painel 
		JPanel painel1 = new JPanel();
		Border etched = BorderFactory.createEtchedBorder();
		titled = BorderFactory.createTitledBorder(etched,"M�todos");
		painel1.setBorder(titled);
		GridBagLayout layout = new GridBagLayout();	
		GridBagConstraints configs = new GridBagConstraints();
		painel1.setLayout(layout);	
		configs.fill=GridBagConstraints.NONE;
		configs.anchor=GridBagConstraints.CENTER;
		configs.weightx=100; configs.weighty=100; // vai esticar na vertical	
		//for (int i=0;i<opMetodos.length;i++){
		//  add(painel1,but[i],configs,0,i,1,1); // ocupa 1 linha da grade
		//}

//		Painel que engloba painel 1 
		JPanel painelCentral1 =new JPanel();		
		painelCentral1.setLayout(layout); 
		configs.fill=GridBagConstraints.BOTH;
		configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
		add(painelCentral1,painel1,configs,0,0,1,4); // ocupa 1 coluna - 4 linhas	
		configs.weightx=100; configs.weighty=100; // vai esticar na horizontal
		
//		Cria um painel para os botoes de controle
		//JPanel painelBotoes=new JPanel();	
		//salvaButton=new JButton("SALVAR DADOS E RESULTADOS");
		//salvaButton.addActionListener(this);	
		//sairButton=new JButton("Exit");
		//sairButton.addActionListener(this);
		//painelBotoes.add(salvaButton);
		//painelBotoes.add(sairButton);
		//JPanel painelAutor=new JPanel();
		//JLabel autor=new JLabel("ISANE",SwingConstants.SOUTH_EAST);
		//autor.setFont(new Font("TimesRoman",Font.ITALIC,11));	
		//painelAutor.add(autor,BorderLayout.EAST);
		//JPanel painelControles=new JPanel();
		//painelControles.setLayout(new BorderLayout());
		//painelControles.add(painelBotoes,BorderLayout.CENTER);
		//painelControles.add(painelAutor,BorderLayout.EAST);
		
//		Cria um painel para o titulo de entrada de dados
		JPanel painelTitulo2=new JPanel();
		titled = BorderFactory.createEtchedBorder();
		painelTitulo2.setBorder(titled);
		JLabel titEnt=new JLabel("Model Stiffness",SwingConstants.CENTER);
		painelTitulo2.add(titEnt);
		
		// Painel para a matriz de rigidez do modelo
		//tabelaModeloA=new MyTableModel(matrizA,ordem,ordem);
		//tableA = new JTable(tabelaModeloA);
		int qlar=larguraTotal/2; int qalt=ordem*tableA.getRowHeight();
	     tableA.setPreferredScrollableViewportSize(new Dimension(qlar+5, qalt+2));
	     tableA.setEnabled(false);
	     tableA.getModel().addTableModelListener(this);
	     for (int i = 0; i < tableA.getColumnCount(); i++) {
	       tableA.getColumnModel().getColumn(i).setMaxWidth(100);
	       tableA.getColumnModel().getColumn(i).setMinWidth(30);
	     }
	     scrollPaneTabelaA = new JScrollPane(tableA);
	     painelMA=new JPanel();
		titled = BorderFactory.createTitledBorder(etched,"MATRIZ K");
		painelMA.setBorder(titled);
	     painelMA.add(scrollPaneTabelaA);

		
//		Painel que engloba os paines das matrizes
		painelCentral2 =new JPanel();		
		painelCentral2.setLayout(layout);
		configs.fill=GridBagConstraints.BOTH;
		configs.weightx=100; configs.weighty=0; // vai esticar na vertical e horizontal
		add(painelCentral2,painelTitulo2,configs,0,0,3,1); // ocupa 3 colunas - 1 linhas
		configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
		add(painelCentral2,painelMA,configs,0,1,2,5); // ocupa 2 colunas - 5 linhas	
		configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
		add(painelCentral2,painelMB,configs,2,1,1,5); // ocupa 1 coluna - 5 linhas
		add(painelCentral2,painelMX,configs,3,1,1,5); // ocupa 1 coluna - 5 linhas
			
		// adiciona os paineis titulo, central e botoes ao content atual
		setLayout(layout);
		configs.fill=GridBagConstraints.BOTH;
		configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical	
		add(this,paineltitulo,configs,0,0,1,1); // ocupa 1 colunas,1 linha da grade
		configs.weightx=100; configs.weighty=100; // vai esticar na horizontal/vertical
		add(this,painelCentral1,configs,0,1,1,4); // ocupa 1 coluna, 4 linhas da grade
		configs.weightx=100; configs.weighty=100; // nao vai esticar na vertical
		add(this,painelCentral2,configs,0,5,1,5); // ocupa 1 coluna, 4 linhas da grade
		configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical
		//add(this,painelControles,configs,0,10,1,1); // ocupa 1 linhas da grade
		
	  }// fim de menuPanel-construtor
	  
	  public void setParametro(int p){
	  	ordem = p;  	
	  }
	  
	  public int getParametro(){
	  	return ordem;  	
	  }
	   
	  /** automatiza o posicionamento no layout GridBagLayout
	   * @param j container a adicionar o componente
	   * @param c componente a adicionar o elemento
	   * @param gbc configuracoes do gridbaglayout
	   * @param x coluna da grade
	   * @param y linha da grade
	   * @param w percentagem de esticamento em x
	   * @param h percentagem de esticamento em y */
	  public void add(Container j, Component c, GridBagConstraints gbc, int x,int y, int w, int h){
	    gbc.gridx=x;
	    gbc.gridy=y;
	    gbc.gridwidth=w;
	    gbc.gridheight=h;
	    //j.add(c,gbc);
	  }
	  
	   /** Metodo para tratamento de valores inseridos em JTextField
	   * @param e DocumentEvent capturado   */
	  public void insertUpdate (DocumentEvent e) {
	    try {
	      validaDados(); 
	    }
	    catch (Exception ex){
	    quadroRes.setText(ex.getMessage());
	    }
	  }
	  /** Metodo para tratamento de valores removidos em JTextField
	   * @param e DocumentEvent capturado   */
	  public void removeUpdate (DocumentEvent e) {validaDados(); }
	  /** Metodo para tratamento de valores alterados em JTextField
	   * @param e DocumentEvent capturado   */
	  public void changedUpdate (DocumentEvent e) {validaDados(); }
	  
	  /** Metodo para validacao e conversao dos campos tipo texto 
	   * dos parametros digitados pelo usuario */
	  public void validaDados()
	  {}
	    // obtem as strings de todos os textos digitados
	    //String dadon=param1.getText();
	    //dadon=dadon.trim();
	    //if (dadon.equals("")) dadon="0";    
	    // verifica os dados e guarda os valores convertidos em 
	    // numeros no objeto par.    
	    //if (ValidacaoDados.eIntPosNN(dadon))
	   // { 
	    /*  quadroRes.setText("Dados corretos\n"+param1.getText());
	      Integer n=new Integer(dadon);
	      this.ordem=n.intValue();
	      this.matrizA=inicializaMatriz(0);
	      this.tabelaModeloA=inicializaTabelaModelo(this.matrizA,ordem,ordem); 
	      tableA.setModel(tabelaModeloA); tableA.repaint();
	      tableA.getModel().addTableModelListener(this);
	      this.matrizB=inicializaVetor(0);
	      this.tabelaModeloB=inicializaTabelaModelo(this.matrizB,1,ordem); 
	      tableB.setModel(tabelaModeloB); tableB.repaint();
	      tableB.getModel().addTableModelListener(this);
	      this.matrizX=inicializaVetor(0);
	      this.tabelaModeloX=inicializaTabelaModelo(this.matrizX,1,ordem); 
	      tableX.setModel(tabelaModeloX); tableX.repaint();
	       //verifica se a largura da tabela ultrapassa limite do painel
	      // se auto_resize estiver ligado, as colunas se ajustam para caber, mas 
	      // a partir de um certo ponto atrapalha tudo
	          
	      redimensionaSP();      
	    }
	    else quadroRes.setText("Dados incorretos\n"+param1.getText());
	  }
	  	*/
		/** executa o m�todo escolhido
		 * @param evt  objeto com o evento escolhido 	 */
		public void actionPerformed(ActionEvent evt) 
		{
		  
		}// fim de actionPerformed
		
		/** @param n numero de espa�os 
		* @return  uma string com n espacos */
		public String espacos(int n){
		  if (n<2)n=2;
		  String esp="";
		  for (int i=0;i<n;i++) esp+=" ";
		  return esp;
		}

	  	/* (non-Javadoc)
	  	 * @see javax.swing.event.TableModelListener#tableChanged(javax.swing.event.TableModelEvent)
	  	 */
	  	public void tableChanged(TableModelEvent e) {
		    //int row = e.getFirstRow();
		    //int column = e.getColumn();
		   // MyTableModel model = (MyTableModel)e.getSource();	    
		    //Object data = model.getValueAt(row, column);
		    //String nomeModelo="";Double val=new Double(0);
		   // if (model==tabelaModeloA)matrizA[row][column-1]=(Double)data;	      
		   // if (model==tabelaModeloB)matrizB[row][column-1]=(Double)data;	      
		    //quadroRes.setText(txt);
		    //calcula();
		  }
		
		
		
	/** metodo para reinicializar uma matriz de objects 
	 * @param va valor com o qual a matriz sera inicializado
	* @return um matriz de ordemxordem reinicializada */
	public Object[][] inicializaMatriz(double va){
	  Double valor=new Double(va);
	  Object[][] mat=new Object[ordem][ordem];
	  for (int i=0;i<ordem;i++){
	    for (int j=0;j<ordem;j++)mat[i][j]=(Object)valor;
	  }
	  return mat;  
	}

	/** metodo para reinicializar um vetor 
	 * @param va valor com o qual o vetor sera inicializado
	* @return um matriz de 1 coluna reinicializada */
	public Object[][] inicializaVetor(double va){
	  Double valor=new Double(va);
	  Object[][] mat=new Object[ordem][1];
	  for (int i=0;i<ordem;i++){
	    mat[i][0]=(Object)valor;
	  }
	  return mat;  
	}

	/** Metodo para reinicializar o modelo de tabela 
	 * @param mat nova matriz de objetos
	* @param nc numero de colunas
	* @param nl numero de linhas
	* @return um novo modelo de tabela */
	//public MyTableModel inicializaTabelaModelo(Object[][]mat,int nc,int nl){
	//  MyTableModel tabModel=new MyTableModel(mat,nc,nl);
	//  return tabModel;
	//}

	/** Metodo para redimensionar os scrollpanes de acordo como novos limites */
	public void redimensionaSP(){
	  int qlar=(int)(painelMA.getWidth()*0.9);  
	  int qalt=ordem*tableA.getRowHeight(); 
	  if (ordem>((int)(0.9*painelMA.getWidth()/30)-2)){
	    tableA.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	    for (int i = 0; i < tableA.getColumnCount(); i++) {
	      tableA.getColumnModel().getColumn(i).setMaxWidth(40);
	      tableA.getColumnModel().getColumn(i).setMinWidth(30);
	    }
	    qalt+=scrollPaneTabelaA.getHorizontalScrollBar().getHeight();
	  }
	  else {
	    tableA.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
	    for (int i = 0; i < tableA.getColumnCount(); i++) {
	      tableA.getColumnModel().getColumn(i).setMaxWidth(1000);
	      tableA.getColumnModel().getColumn(i).setMinWidth(30);
	      tableA.getColumnModel().getColumn(i).setPreferredWidth(75);
	    }
	  }
	  // verifica se a altura nao ultrapassou o limite do painel   
	  int limAltura=(int)(0.8*painelMA.getHeight());
	  qalt+=tableA.getRowHeight()+5;
	  if (qalt>limAltura) qalt=limAltura;  
	  int qlarsp=(int)(0.9*qlar);
	  tableA.setPreferredScrollableViewportSize(new Dimension(qlarsp, qalt));  
	  tableA.revalidate(); tableA.repaint();
	  scrollPaneTabelaA.setSize(new Dimension(qlarsp,qalt));
	  scrollPaneTabelaA.revalidate(); scrollPaneTabelaA.repaint();
	  
	  //  redefine matrizB  
	  qlarsp=scrollPaneTabelaB.getWidth();
	  tableB.setPreferredScrollableViewportSize(new Dimension(qlarsp, qalt));     
	  tableB.repaint(); tableB.revalidate();  
	  scrollPaneTabelaB.setSize(new Dimension(qlarsp,qalt));
	  scrollPaneTabelaB.revalidate(); scrollPaneTabelaB.repaint();
	  
	  //  redefine matrizX
	  qlarsp=scrollPaneTabelaX.getWidth();  
	  tableX.setPreferredScrollableViewportSize(new Dimension(qlarsp, qalt));     
	  tableX.repaint(); tableX.revalidate();
	  scrollPaneTabelaX.setSize(new Dimension(qlarsp,qalt));
	  scrollPaneTabelaX.revalidate(); scrollPaneTabelaX.repaint();
	  
	}

}
